package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	/*
		在Go语言中，标准输入输出是指程序默认的输入输出流。与 os.Stdin、os.Stdout 的区别：
		（1）标准输入输出 是基本的 I/O 操作，而 os.Stdin 和 os.Stdout 则是封装了 Go语言操作系统接口的类型。
		（2）标准输入输出 可以使用 fmt包、bufio包等来进行格式化输出和读取输入，而 os.Stdin 和 os.Stdout 只能进行进本的读取和写入操作。
		（3）标准输入输出 通常情况下是与 终端 交互的，而 os.Stdin 和 os.Stdout 可以被重定向到文件或者其他设备上。

		os.Stdin 不仅可以读取终端上的输入信息，还可以重定向到文件或其他设备上进行操作。

		终端操作：
		例如，可以将一个 文本文件 作为输入 重定向到程序中：
		$ cat input.txt | go run main.go
		cat 命令会将 input 文件的内容输出到标准输出，然后使用 管道（|）符号将其传递给程序，程序会将 os.Stdin 作为输入流来读取这些数据。

		类似的，可以将程序的输出重定向到一个文件：
		$ go run main.go > output.txt
		程序的标准输出会被重定向到 output.txt 文件中，而不是输出到终端上。


	*/
	inputReader := bufio.NewReader(os.Stdin) //将标准输入与读取器绑定，读取内容，返回带缓存的Reader对象
	fmt.Println("Please enter some input: ")
	input, err := inputReader.ReadString('\n') //缓存对象到换行为止
	if err == nil {
		fmt.Printf("The input was: %s\n", input) //读取顺利则打印读取内容
	}

	fmt.Println("----------- 标准输入输出与 os.Stdin、os.Stdout -------------")

	//如果有一个程序需要从标准输入读取数据并输出到标准输出，则可以直接使用 fmt包 的 Scan 和 Println 方法：
	var input1 string
	fmt.Scan(&input1)
	fmt.Println("Hello, " + input1)

	//如果想要使用 os.Stdin 和 os.Stdout，可以使用类似以下的方法：
	scanner := bufio.NewScanner(os.Stdin) //默认按行读取
	for scanner.Scan() {
		os.Stdout.WriteString(scanner.Text())
		//fmt.Println(scanner.Text())
	}
}
